﻿using System;
using System.Resources;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Reflection;
using System.IO;

namespace DAL
{
    public abstract class BaseDAL
    {
        #region "Propiedades"

        private string ConnectionString
        {
            get
            {
                if (ConfigurationManager.ConnectionStrings[this.DbType.ToString()] == null)
                {
                    throw new Exception("No se encontro la cadena de conexión para el gestor de Base de Datos establecido(" + this.DbType.ToString() + ") en el archivo de configuración.");
                }

                return ConfigurationManager.ConnectionStrings[this.DbType.ToString()].ToString();
            }
        }

        private DAL.Gateway.EDBMS? DbType
        {    
            get
            {                
                if (ConfigurationManager.AppSettings["DbType"] == null)
                {
                    throw new Exception("No se encontro la llave \"DBType\" en el archivo de configuración.");
                }

                DAL.Gateway.EDBMS DBConnect;
                switch (ConfigurationManager.AppSettings["DbType"].ToUpper())
                {
                    case "FIREBIRD": DBConnect = DAL.Gateway.EDBMS.Firebird; break;
                    case "HSQLDB": DBConnect = DAL.Gateway.EDBMS.HSQLDB; break;
                    case "MSACCESS": DBConnect = DAL.Gateway.EDBMS.MSAccess; break;
                    case "MYSQL": DBConnect = DAL.Gateway.EDBMS.MySql; break;
                    case "ORACLE": DBConnect = DAL.Gateway.EDBMS.Oracle; break;
                    case "POSTGRESQL": DBConnect = DAL.Gateway.EDBMS.PostgreSQL; break;
                    case "SQLSERVER": DBConnect = DAL.Gateway.EDBMS.SqlServer; break;
                    default: return null;
                }

                return DBConnect;
            }
        }
        private string EventLogAppName
        {
            get
            {
                return ConfigurationManager.AppSettings["EventLogAppName"].ToString();
            }
        }
        private string EventLogEntryName
        {
            get
            {
                return ConfigurationManager.AppSettings["EventLogEntryName"].ToString();
            }
        }

        #endregion

        public BaseDAL()
        {
            try
            {
                if (this.DbType == null)
                {
                    throw new Exception("Hay un problema con el archivo de configuración, el valor de la llave \"DBType\" no es válido.");
                } 

                if (String.IsNullOrEmpty(this.ConnectionString))
                {
                    throw new Exception("Hay un problema con el archivo de configuración, el valor de la llave \"ConnectionStringDefault\" no es válido.");
                }

                DAL.Gateway.Conexion.IniciarSesion(this.ConnectionString, (DAL.Gateway.EDBMS)this.DbType);
            }
            catch (Exception ex)
            {
                throw new Exception("-> (BaseDAL|Constructor) - " + ex.Message + " ");
            }  
        }   
    }
}
